/**
 * @author Fang Lu, fanglupku@gmail.com
 * 2011-3-23
 */
package code.extract;

import java.util.ArrayList;

public class CodeExtractor {
	public static final int NO_MERGE = 0;
	public static final int EMPTY_REMOVE = 1;
	public static final int CONTINUAL_MERGE = 1 << 1;
	public static final int SMALL_CODE_MERGE = 1 << 2;
	public static final int EMPTY_MERGE = 1 << 3;
	public static String pretreatPageContent(String pageContent){
		String text = CodePageDealer.eraseAllComment(pageContent);
		text = CodePageDealer.eraseOneTagAndContent(text, "head");
		text = CodePageDealer.eraseOneTagAndContent(text, "script");
		text = CodePageDealer.eraseOneTagAndContent(text, "style");
		text = text.replaceAll("<br((\\s*?)|(\\s+?.*?))>", "\n");
		return text;
	}
	/**
	 * This is 
	 * @param pageContent
	 * @param mergeModel
	 * @return
	 */
	public static ArrayList<SegmentItem> extractCodeSegmentFromPage(String pageContent, int mergeModel){
		String text = pretreatPageContent(pageContent);
		ArrayList<String> tagList = new ArrayList<String>();
		/*
		 * this tag list is given by wanglijie
		 */		
		tagList.add("code");
		tagList.add("pre");
		
		tagList.add("div");
		
		tagList.add("p");
		
		tagList.add("td");
		tagList.add("tr");
		tagList.add("table");
		
		tagList.add("ol");
		tagList.add("ul");
		
		tagList.add("h1");
		tagList.add("h2");
		tagList.add("h3");
		tagList.add("h4");
		tagList.add("h5");
		tagList.add("h6");
		
		tagList.add("hr");
		
		/*
		 * this tag list is old tag list
		 */
//		tagList.add("code");
//		tagList.add("pre");
//		tagList.add("div");
//		tagList.add("p");
//		tagList.add("td");
//		tagList.add("ol");
//		tagList.add("ul");
		
		ArrayList<SegmentItem> tList = CodePageDealer.getTextFragmentInPage(text, tagList);
		tList = HTMLEntityTransform.segmentItemBatchTransform(tList, null);
		if ((mergeModel & EMPTY_MERGE) != 0) {
			tList = CodePageDealer.mergeEmptySegmentItem(tList, null);
		}
		if ((mergeModel & EMPTY_REMOVE) != 0){
			tList = CodePageDealer.filterEmptySegmentItem(tList, null);
		}
		if ((mergeModel & CONTINUAL_MERGE) != 0){
			tList = CodeMerger.continualCodeMerge(tList);
		}		
		if ((mergeModel & SMALL_CODE_MERGE) != 0){
			tList = CodeMerger.smallCodeMerge(tList);
		}
		for (int i=0; i<tList.size(); ++i){
			if (CodeJudge.isCode(tList.get(i).getContent())){
				tList.get(i).setCodeType();
			}
		}
		
		return tList;
	}
}
